// 用户路由表

// 加载模块
const express = require('express');
const sendMail = require('../utils/email');
const usersModel = require('../db/models/usersModel');
// 可以在当前路由表中使用usersModel来操作users数据集合
const jwt = require('jsonwebtoken');
const fs = require('fs');
const template = require('art-template');

// 创建一张路由表（空表）
const router = express.Router();

// 向路由表添加内容:

// 判断是否登录接口
router.get('/islogin',(req,res)=>{
    // 获取session id对应的session data
    // 客户端携带session id过来后，自动匹配到对应的session data
    // console.log( req.session );
    // Session {
    //     cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true },
    //     login: 'is login',
    //     username: 'xiaoming'
    // }
    
    // if (req.session.login === 'is login') {
    //     // 已登录
    //     res.send({"code":1,"msg":"用户已登录","username":req.session.username});
    // } else {
    //     // 未登录
    //     res.send({"code":0,"msg":"用户未登录","username":""});
    // }

    // 验证token
    let token = req.headers.authorization;
    jwt.verify(token,'hehehaha',(err,payload)=>{
        if (err) {
            res.send({"code":0,"msg":"token验证失败"});
        } else {
            res.send({"code":1,"msg":"token验证成功","info":payload});
        }
    })
})

// 退出登录接口
router.get('/logout',(req,res)=>{
    // 销毁session data
    req.session.destroy((err)=>{
        if (err) {
            res.send({"code":0,"msg":"退出登录失败"});
        } else {
            res.send({"code":1,"msg":"退出登录成功"});
        }
    })
})

// 登录流程：
// 1.前端发送登录请求
// 2.后端接收登录请求（获取请求参数）
    // 创建一个session
// 3.后端验证账号密码（查询数据库）
    // 成功：向session data中存储数据，响应登录成功
    // 失败：响应登录失败
// 4.后端响应登录结果给前端
// 5.前端收到登录结果
    // 反馈给用户
    // 客户端设置一个cookie保存session id
// 6.之后的所有客户端请求，自动携带session id到服务端
// 7.服务端根据session id自动匹配session data（验证是否已登录）
// 8.后端响应是否已登录结果
// 9.前端接收是否已登录结果

// 登录接口
// 1.请求方式：post
// 2.接口地址：http://localhost:9999/user/login
// 3.请求参数：username账号  password密码
// 4.响应结果：{"code":1,"msg":"登录成功"}
router.post('/login',(req,res)=>{
    // 获取post请求参数
    let {username,password} = req.body;
    
    // 查询数据库
    usersModel.find({$and:[{username},{password}]})
    .then((arr)=>{
        if (arr.length > 0) {
            // 获取session data
            // console.log( req.session );// session {...}
            
            // 登录成功，向session data中存储数据
            // req.session.login = 'is login';// 已登陆的标识
            // req.session.username = username;// 用户信息

            // 登录成功，生成token， 并保存用户信息
            let info = {
                "username":arr[0].username,
                "email":arr[0].email
            }
            let token = jwt.sign(info,'hehehaha',{expiresIn:60*30});

            // 响应请求
            res.send({"code":1,"msg":"登录成功",token});
            
            // 重定向（跳转到百度首页）
            // res.status(301);
            // res.redirect('https://www.baidu.com/');
        } else {
            // 登录失败
            res.send({"code":0,"msg":"账号或密码错误"});
        }
    })
    .catch((err)=>{
        // 出错了
        res.send({"code":-1,"msg":err});
    })

    // res.send('login is ok');
})

// 缓存验证码
let cachedCode = {
    // '12345678@qq.com': '23487',
    // '87654321@qq.com': '37374'
}

// 注册的流程：
// 1.前端发送注册请求
// 2.后端接收注册请求（接收请求参数）
// 3.后端校验数据格式（长度、构成、类型等）
// 4.查询数据库，看是否已注册
// 5.数据入库（增加一条数据）
// 6.后端响应注册结果给前端
// 7.前端接收响应结果并反馈给用户

// 注册接口
// 1.请求方式：post
// 2.接口地址：http://localhost:9999/user/register
// 3.请求参数：username账号  password密码  phone手机号  email邮箱  age年龄  sex性别  code验证码
// 4.响应结果：{"code":1,"msg":"注册成功"}
router.post('/register',(req,res)=>{
    // 获取post请求参数
    let {username,password,phone,email,age,sex,code} = req.body;

    // 校验验证码
    if (cachedCode[email] !== code) {
        return res.send({"code":-9,"msg":"验证码错误！"});
    }

    // 校验数据格式
    let reg1 = /^\w{6,18}$/;
    if (!reg1.test(username)) {
        return res.send({"code":-1,"msg":"账号格式不符合要求！"});
    }
    let reg2 = /^\w{6,18}$/;
    if (!reg2.test(password)) {
        return res.send({"code":-2,"msg":"密码格式不符合要求！"});
    }
    let reg3 = /^1[3-9]\d{9}$/;
    if (!reg3.test(phone)) {
        return res.send({"code":-3,"msg":"手机号格式不符合要求！"});
    }
    let reg4 = /^\w{6,20}@[0-9a-zA-Z]{1,12}(\.[a-zA-Z]{2,3}){1,2}$/;
    if (!reg4.test(email)) {
        return res.send({"code":-4,"msg":"邮箱格式不符合要求！"});
    }
    let reg5 = /^\d{1,3}$/;
    if (!reg5.test(age)) {
        return res.send({"code":-5,"msg":"年龄格式不符合要求！"});
    }
    let reg6 = /^[男女妖]$/;
    if (!reg6.test(sex)) {
        return res.send({"code":-6,"msg":"性别格式不符合要求！"});
    }

    // 查询数据库
    usersModel.find({username})
    .then((arr)=>{
        if (arr.length > 0) {
            // 账号已被注册
            res.send({"code":0,"msg":"账号已存在！"});
            // 终止链式调用
            return new Promise(()=>{});
        } else {
            // 可以注册，添加一条数据
            return usersModel.insertMany({username,password,phone,email,age,sex})
        }
    })
    .then((arr)=>{
        if (arr.length > 0) {
            res.send({"code":1,"msg":"注册成功！"});
        } else {
            res.send({"code":-7,"msg":"注册失败！"});
        }
    })
    .catch((err)=>{
        res.send({"code":-8,"msg":err});
    })

    // res.send('register is ok');
})

// 邮箱验证码接口
// 1.请求方式：post
// 2.接口地址：http://localhost:9999/user/sendmail
// 3.请求参数：email邮箱  2239222721@qq.com
// 4.响应结果：{"code":1,"msg":"邮件发送成功"}
router.post('/sendmail',(req,res)=>{
    // 获取post请求参数
    let {email} = req.body;

    // 生成随机验证码
    let code = parseInt( Math.random() * 100000 );

    // 缓存验证码
    cachedCode[email] = code+'';

    // 发送邮件
    sendMail(email,'注册验证码','您的注册验证码为：'+code)
    .then(()=>{
        res.send({"code":1,"msg":"邮件发送成功"});
    })
    .catch(()=>{
        res.send({"code":0,"msg":"邮件发送失败"});
    })

    // res.send('sendmail is ok');
})

// 个人中心接口
router.get('/center',(req,res)=>{
    // 获取get请求的参数
    let {a,b} = req.query;

    let data = {
        username: 'xiaoming',
        password: '123123',
        a,
        b
    }
    res.send(data);
})

// 延时响应接口
router.get('/dely',(req,res)=>{
    setTimeout(()=>{
        res.send({"code":1,"msg":"响应成功"});
    },2000);
})

// 代理接口
const https = require('https');
const { log } = require('console');
router.get('/proxy',(req,res)=>{
    // 接收get请求参数
    let {url} = req.query;
    let data = '';

    // 在服务端向目标地址发送请求
    https.get(url,(response)=>{
        response.on('data',(chunk)=>{
            // 当收到一个数据片段时，触发一次data事件
            console.log( '------------------------------------------------' );
            // console.log( chunk );// 一个数据片段 Buffer二进制数据流
            // console.log( chunk+'' );// 一个数据片段 字符串
            data += chunk;
        });
        response.on('end',()=>{
            // 数据片段传输完成后触发end事件
            // console.log( data );// 接口响应的完整数据

            // 将请求到的数据响应给前端
            res.send(data);
        })
    })
})

// jsonp接口
router.get('/jsonp',(req,res)=>{
    let {abc} = req.query;
    console.log( abc );// 123

    // 响应请求
    // res.send('hello');
    // res.send('let abc = 123;');
    // res.send('let json = {"name":"小错","age":25};');
    res.send('test({"name":"小错","age":25})');
})

router.get('/jsonp2',(req,res)=>{
    // let {cb} = req.query;
    let {callback} = req.query;
    // console.log( callback );// 是前端全局的一个函数名，如 'test'  'hehe'  ...

    let data = {
        name: 'xiaoming',
        age: 23,
        sex: '男',
        email: '123456789@qq.com'
    }

    res.send(`${callback}(${JSON.stringify(data)})`);
    // res.send(`test({...})`);
    // res.send(`hehe({...})`);
})

// 用户列表接口（提供数据）
router.get('/userList',(req,res)=>{
    // 查询所有用户
    usersModel.find()
    .then((arr)=>{
        res.send(arr);
    })
    .catch((err)=>{
        res.send({"err":1,"msg":"获取数据失败"});
    })
})

// 用户列表接口（提供页面）
router.get('/userListPage',(req,res)=>{
    // 查询所有用户
    usersModel.find()
    .then((arr)=>{
        // 拼接页面结构
        let tmp = '';
        arr.forEach(item=>{
            tmp += `<tr>
                    <td>${item.username}</td>
                    <td>${item.password}</td>
                    <td>${item.phone}</td>
                    <td>${item.email}</td>
                    <td>${item.sex}</td>
                    <td>${item.age}</td>
                </tr>`;
        })

        // 读取模板文件
        fs.readFile('./www/4-用户列表-后端渲染.html','utf8',(err,data)=>{
            if (err) {
                res.send('404 not found');
            } else {
                // 替换模板文件中的指定标识 'hehehaha'
                data = data.replace('hehehaha',tmp);
                // 设置响应头
                res.set('Content-Type','text/html;charset=utf-8');
                // 响应请求
                res.send(data);
            }
        })
    })
    .catch((err)=>{
        res.send('404 not found');
    })
})

// 用户列表接口2（提供页面）
router.get('/getList',(req,res)=>{
    // 查询所有用户
    usersModel.find()
    .then((datas)=>{
        // 读取模板文件
        fs.readFile('./www/7-用户列表-后端使用模板引擎渲染.html','utf8',(err,str)=>{
            if (err) {
                res.send('404 not found');
            } else {
                // 使用模板引擎渲染读取到的模板文件
                let htmlStr = template.render(str,{arr:datas});
                // 设置响应头
                res.set('Content-Type','text/html;charset=utf-8');
                // 响应请求
                res.send(htmlStr);
            }
        });
    })
    .catch((err)=>{
        res.send('404 not found');
    })
})

// 模块输出路由表
module.exports = router;
